﻿using LM.InterfacesFabricas.Basicos.Enumeradores;
using LM.InterfacesFabricas.DTOs;
using LM.Tela.Desktop.Utilidades;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace LM.Tela.Desktop
{
    public partial class frmEndereco : Form
    {
        private frmCliente _frmCliente;
        public List<DtoEndereco> Enderecos { get; set; }

        public frmEndereco(frmCliente frmCliente)
        {
            InitializeComponent();
            _frmCliente = frmCliente;

            //carrega unidades federativas
            cbUf.DataSource = Enum.GetValues(typeof(EnumUnidadeFederativa));
            cbUf.SelectedIndex = -1;
        }

        private void PrepareTelaParaNovoRegistro()
        {
            ControladorDeFormulario.LimpaFormulario(this);
            CarregueItensJaCadastrados();
            mskCodigo.Enabled = true;
            mskCodigo.Focus();
        }

        private bool EmEdicao()
        {
            return !string.IsNullOrWhiteSpace(mskCodigo.Text) && mskCodigo.Enabled == false;
        }

        private void frmEndereco_FormClosed(object sender, FormClosedEventArgs e)
        {
            _frmCliente.cliente.Endereco = Enderecos;
            _frmCliente.MostraClienteNoFormulario();
        }

        private void CarregueItensJaCadastrados()
        {
            grdEndereco.AutoGenerateColumns = false;
            grdEndereco.DataSource = null;
            grdEndereco.DataSource = Enderecos;
        }

        private void btnSalvar_Click_1(object sender, EventArgs e)
        {
            if (Enderecos == null)
                Enderecos = new List<DtoEndereco>();

            int codigo;
            int.TryParse(mskCodigo.Text, out codigo);

            int cep;
            int.TryParse(txtCep.Text, out cep);

            int numero;
            int.TryParse(txtNumero.Text, out numero);

            EnumUnidadeFederativa uf;
            Enum.TryParse(cbUf.SelectedItem == null ? string.Empty : cbUf.SelectedItem.ToString(), true, out uf);

            var endereco = new DtoEndereco()
            {
                Codigo = codigo,
                Logradouro = txtLogradouro.Text.Trim(),
                Numero = numero,
                Lote = txtLt.Text.Trim(),
                Quadra = txtQd.Text.Trim(),
                Bairro = txtBairro.Text.Trim(),
                Complemento = txtComplemento.Text.Trim(),
                Cep = cep,
                Cidade = txtCidade.Text.Trim(),
                Uf = uf,
            };

            if (!EmEdicao())
            {
                Enderecos.Add(endereco);
            }
            else
            {
                if (grdEndereco.Rows.Count > 0)
                {
                    Enderecos.RemoveAt(grdEndereco.SelectedRows[0].Index);
                    Enderecos.Add(endereco);
                }
            }

            PrepareTelaParaNovoRegistro();
        }

        private void grdEndereco_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {
                var endereco = ((IList<DtoEndereco>)grdEndereco.DataSource)[e.RowIndex];

                mskCodigo.Text = endereco.Codigo.ToString(CultureInfo.InvariantCulture);
                mskCodigo.Enabled = false;
                txtLogradouro.Text = endereco.Logradouro;
                txtNumero.Text = endereco.Numero.ToString();
                txtLt.Text = endereco.Lote;
                txtQd.Text = endereco.Quadra;
                txtBairro.Text = endereco.Bairro;
                txtComplemento.Text = endereco.Complemento;
                txtCep.Text = endereco.Cep.ToString();
                txtCidade.Text = endereco.Cidade;
                cbUf.SelectedItem = endereco.Uf;
            }
        }

        private void btnNovo_Click(object sender, EventArgs e)
        {
            PrepareTelaParaNovoRegistro();
        }

        private void frmEndereco_Load(object sender, EventArgs e)
        {
            PrepareTelaParaNovoRegistro();
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            if (!EmEdicao())
            {
                this.ExibaInconsistencia("Endereço não selecionado para exclusão.");
            }
            else
            {
                if (grdEndereco.Rows.Count > 0)
                {
                    Enderecos.RemoveAt(grdEndereco.SelectedRows[0].Index);
                }

                PrepareTelaParaNovoRegistro();
            }
        }
    }
}
